package learnjava.concur.chapter8;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.Executors;

@Slf4j(topic = "P012")
public class P012 {

    public static void main(String[] args) {

        //1.七参原始构造
//        ThreadPoolExecutor tpe = new ThreadPoolExecutor();

        //2.Executors构造已有定制化线程池

        //2.1  newFixedThreadPool：只有核心线程没有救急线程，任务等待队列最大Integer.MAX_VALUE
        //由于线程数不多，适用于任务不很密集的场景
//        ExecutorService pool = Executors.newFixedThreadPool(2);

        //2.2 newCachedThreadPool：只有救急线程没有核心线程，最大线程数为Integer.MAX_VALUE
        //任务队列采用SynchronousQueue：有任务了才能被拿走，是一个容量为1的同步阻塞队列
        //线程几乎可以无限创建，适用于任务密集但执行时间较短（少于救急线程空闲时间）的情况
//        ExecutorService pool = Executors.newCachedThreadPool();

        //2.3 newSingleThreadExecutor：只有一个线程且是核心线程，
        // 一个任务抛出异常后，后面的任务会用新创建线程来处理，这是自己创建单线程无法做到的
        //此外，该线程池的线程数永远为1，无法修改，因为它是修饰类修饰过的ThreadPoolExecutor，把setCorePoolSize屏蔽了
        ExecutorService pool = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 5; i++) {
            int j = i;
            pool.execute(()->{
                log.warn("{}",j);
            });
        }
    }
}
